/**
 * Copyright (c) 2013, jamiesun, All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 *     Redistributions of source code must retain the above copyright notice, this
 *     list of conditions and the following disclaimer.
 * 
 *     Redistributions in binary form must reproduce the above copyright notice, this
 *     list of conditions and the following disclaimer in the documentation and/or
 *     other materials provided with the distribution.
 * 
 *     Neither the name of the {organization} nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.toughradius.components;

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.picocontainer.Startable;
import org.toughradius.annotation.Inject;
import org.toughradius.task.ExpireRemoveTask;

@Inject
public class TaskService implements Startable {
    private static AtomicInteger number = new AtomicInteger(0);
    private final static Log log = LogFactory.getLog(TaskService.class);

    private ExpireRemoveTask expireRemoveTask;
    private ScheduledThreadPoolExecutor schedule;

    public void setExpireRemoveTask(ExpireRemoveTask expireRemoveTask) {
        this.expireRemoveTask = expireRemoveTask;
    }
    
    public TaskService() {

    }

    public synchronized void start() {
        log.info("TaskExecutor start ......");
        schedule = new ScheduledThreadPoolExecutor(1, new TaskThreadFactory(), new TaskRejectedExecutionHandler());
        schedule.scheduleAtFixedRate(expireRemoveTask, 5, 24*60*60, TimeUnit.SECONDS);
    }
    
    public void stop() {

    }

    class TaskThreadFactory implements ThreadFactory {

        public Thread newThread(Runnable r) {
            return new Thread(r, "TaskService-Thread-" + number.incrementAndGet());
        }

    }

    class TaskRejectedExecutionHandler implements RejectedExecutionHandler {

        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            log.info("task exception:" + r);
        }

    }
}  